#define _CRT_SECURE_NO_WARNINGS 1
//bool isValid(char* s) {
//    ST st;
//    STInit(&st);
//    while (*s)
//    {
//        //将'('，'{' ，'['都入栈
//        if (*s == '(' || *s == '{' || *s == '[')
//        {
//            STPush(&st, *s);
//        }
//        else
//        {
//            //如果栈为空说明没有左括号
//            if (STEmpty(&st))
//            {
//                STDestroy(&st);
//                return false;
//            }
//            STDataType val = STTop(&st);
//            STPop(&st);//取栈顶值,出栈
//            //*s与栈顶值不匹配
//            if (*s == ')' && val != '(' || *s == ']' && val != '[' || *s == '}' && val != '{')
//            {
//                STDestroy(&st);
//                return false;
//            }
//        }
//        s++;
//    }
//    bool ret = STEmpty(&st);//若都匹配成功，则栈空
//    STDestroy(&st);
//    return ret;
//}

//用两个队列实现栈的功能
//两个队列
//typedef struct {
//    Queue s1;
//    Queue s2;
//} MyStack;
//
//
//MyStack* myStackCreate() {
//    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));//创建Mystack
//    QueueInit(&pst->s1);
//    QueueInit(&pst->s2);
//    return pst;
//}
////不为空的队列存数据
//void myStackPush(MyStack* obj, int x) {
//    if (!QueueEmpty(&obj->s1))
//    {
//        QueuePush(&obj->s1, x);
//    }
//    else
//    {
//        QueuePush(&obj->s2, x);
//    }
//}
//
//int myStackPop(MyStack* obj) {
//    Queue* empty = &obj->s1;
//    Queue* unempty = &obj->s2;
//    if (!QueueEmpty(&obj->s1))
//    {
//        unempty = &obj->s1;
//        empty = &obj->s2;
//    }
//    //unempty和empty已经是结构体指针，不需要取地址
//    while (QueueSize(unempty) > 1)//留下队尾的数据
//    {
//        QueuePush(empty, QueueFront(unempty));//将非空队列的值push进空队列
//        QueuePop(unempty);
//    }
//    int top = QueueFront(unempty);
//    QueuePop(unempty);
//    return top;
//}
//
//int myStackTop(MyStack* obj) {
//    Queue* empty = &obj->s1;
//    Queue* unempty = &obj->s2;
//    if (!QueueEmpty(&obj->s1))
//    {
//        unempty = &obj->s1;
//        empty = &obj->s2;
//    }
//    return QueueTail(unempty);
//}
//
//bool myStackEmpty(MyStack* obj) {
//    return QueueEmpty(&obj->s1) && QueueEmpty(&obj->s2);
//}
//
//void myStackFree(MyStack* obj) {
//    QueueDestroy(&obj->s1);
//    QueueDestroy(&obj->s2);
//}


//两个栈实现队列
//两个栈，一个进一个出
//typedef struct {
//    ST push;
//    ST pop;
//} MyQueue;
//
//
//MyQueue* myQueueCreate() {
//    MyQueue* newnode = (MyQueue*)malloc(sizeof(MyQueue));
//    STInit(&newnode->push);
//    STInit(&newnode->pop);
//    return newnode;
//}
//
//void myQueuePush(MyQueue* obj, int x) {
//    STPush(&obj->push, x);
//}
//
//
//int myQueuePeek(MyQueue* obj) {
//    if (STEmpty(&obj->pop))
//    {
//        //倒数据
//        while (!STEmpty(&obj->push))
//        {
//            STPush(&obj->pop, STTop(&obj->push));
//            STPop(&obj->push);
//        }
//    }
//    return STTop(&obj->pop);
//
//}
//
//int myQueuePop(MyQueue* obj) {
//    int front = myQueuePeek(obj);
//    STPop(&obj->pop);
//    return front;
//}
//
//bool myQueueEmpty(MyQueue* obj) {
//    return STEmpty(&obj->pop) && STEmpty(&obj->push);
//}
//
//void myQueueFree(MyQueue* obj) {
//    STDestroy(&obj->pop);
//    STDestroy(&obj->push);
//    free(obj);
//
//}